package com.tonann.app.mapper;

import com.tonann.app.domain.AppDevice;
import com.tonann.common.core.domain.entity.SysPlace;
import com.tonann.common.core.domain.entity.SysUser;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 运行设备Mapper接口
 *
 * @author tonann
 * @date 2022-10-12
 */
public interface AppDeviceMapper
{
    /**
     * 查询运行设备
     *
     * @param deviceId 运行设备主键
     * @return 运行设备
     */
    public AppDevice selectAppDeviceByDeviceId(Long deviceId);

    /**
     * 查询运行设备列表
     *
     * @param appDevice 运行设备
     * @return 运行设备集合
     */
    public List<AppDevice> selectAppDeviceList(AppDevice appDevice);

    /**
     * 根据设备ID的部门查询设备树信息
     *
     * @param deviceId          设备ID
     * @param deptCheckStrictly 部门树选择项是否关联显示
     * @return 选中部门列表
     */
    public List<Long> selectAppDeviceDeptListByDeviceId(@Param("deviceId") Long deviceId, @Param("deptCheckStrictly") boolean deptCheckStrictly);

    public List<Long> selectAppDevicePlaceListByDeviceId(@Param("deviceId") Long deviceId,@Param("placeCheckStrictly") boolean placeCheckStrictly);

    public List<Long> selectAppDeviceAdminListByDeviceId(@Param("deviceId") Long deviceId);

    public List<Long> selectAppDeviceOperatorListByDeviceId(@Param("deviceId") Long deviceId);

    /**
     * 新增运行设备
     *
     * @param appDevice 运行设备
     * @return 结果
     */
    public int insertAppDevice(AppDevice appDevice);

    /**
     * 修改运行设备
     *
     * @param appDevice 运行设备
     * @return 结果
     */
    public int updateAppDevice(AppDevice appDevice);

    /**
     * 删除运行设备
     *
     * @param deviceId 运行设备主键
     * @return 结果
     */
    public int deleteAppDeviceByDeviceId(Long deviceId);

    /**
     * 批量删除运行设备
     *
     * @param deviceIds 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteAppDeviceByDeviceIds(Long[] deviceIds);

    /**
     * 根据ID查询所有子部门
     *
     * @param appDeviceId 部门ID
     * @return 部门列表
     */
    public List<AppDevice> selectChildrenAppDeviceById(Long appDeviceId);

    /**
     * 根据ID查询所有子部门（正常状态）
     *
     * @param appDeviceId 部门ID
     * @return 子部门数
     */
    public int selectNormalChildrenAppDeviceById(Long appDeviceId);

    /**
     * 是否存在子节点
     *
     * @param appDeviceId 部门ID
     * @return 结果
     */
    public int hasChildByAppDeviceId(Long appDeviceId);

    /**
     * 查询部门是否存在用户
     *
     * @param appDeviceId 部门ID
     * @return 结果
     */
    public int checkAppDeviceExistUser(Long appDeviceId);

    /**
     * 校验部门名称是否唯一
     *
     * @param deviceName 部门名称
     * @param parentId 父部门ID
     * @return 结果
     */
    public AppDevice checkAppDeviceNameUnique(@Param("deviceName") String deviceName, @Param("parentId") Long parentId);

    /**
     * 修改所在部门正常状态
     *
     * @param appDeviceIds 部门ID组
     */
    public void updateAppDeviceStatusNormal(Long[] appDeviceIds);

    /**
     * 修改子元素关系
     *
     * @param appDevices 子元素
     * @return 结果
     */
    public int updateAppDeviceChildren(@Param("devices") List<AppDevice> appDevices);

    void deleteAppDeviceDeptByDeviceId(Long deviceId);

    void insertAppDeviceDept(@Param("deviceId") Long deviceId, @Param("deptId") Long deptId);

    void deleteAppDevicePlaceByDeviceId(Long deviceId);

    void insertAppDevicePlace(@Param("deviceId") Long deviceId, @Param("placeId") Long placeId);

    void deleteAppDeviceAdminByDeviceId(Long deviceId);

    void insertAppDeviceAdmin(@Param("deviceId") Long deviceId, @Param("userId") Long userId);

    void deleteAppDeviceOperatorByDeviceId(Long deviceId);

    void insertAppDeviceOperator(@Param("deviceId") Long deviceId, @Param("userId") Long userId);

    public List<AppDevice> selectAppDeviceAll(AppDevice device);

    List<AppDevice> selectAppDeviceByDeviceName(String deviceName);

    List<AppDevice> selectWxDeviceList(AppDevice appDevice);

    List<SysPlace> selectDevicePlaceByDeviceId(Long deviceId);

    List<AppDevice> selectDeviceListByUserId(Long userId);

    List<Long> selectAdminPhoneByDeviceId(Long deviceId);

    List<AppDevice> selectDeviceListIsShow();

    List<SysUser> selectUserByDeviceId(@Param("deviceId")Long deviceId, @Param("userType") String userType);

    AppDevice checkAppDeviceCodeUnique(@Param("deviceCode") String deviceCode);
}
